dbt CloudのIPアドレスをSnowflakeのNetwork policy/ruleとして追加してみた
さがらです。
SnowflakeでIP制限などネットワークの制限をかける場合、Network policy/ruleを適用する必要があります。
既にSnowflakeでネットワーク制限の運用を行っている時にdbt Cloudを新しく採用したと仮定して、dbt CloudとSnowflakeが通信できるようにdbt CloudのIPアドレスをSnowflakeのNetwork policy/ruleとして追加してみたので、その内容を本記事でまとめてみます。
事前準備
まず、事前準備としてベースとなるNetwork policy/ruleをSnowflake上で設定しておきます。
最初に下記のクエリを実行して、Network policy/ruleを定義するためのデータベース・スキーマ・ロールを定義します。
use role securityadmin;
create role network_admin;
grant role network_admin to user <ユーザー名>;
grant role network_admin to role sysadmin; -- カスタムロールのためsysadminにgrant
use role sysadmin;
create database securitydb;
use database securitydb;
create schema network_rules;
grant usage on database securitydb to role network_admin;
grant usage on schema securitydb.network_rules to role network_admin;
grant create network rule on schema securitydb.network_rules to role network_admin;
-- Network policyの作成も、作成したロールで行いたい場合は以下も実行
use role securityadmin;
grant create network policy on account to role network_admin;
次に、指定したIPのみ許可するNetwork policy/ruleの作成とアカウントレベルでの適用を行います。
※Network policyを適用できるのは、各アカウント・ユーザーごとに1つだけのため、ご注意ください。
use role network_admin;
create or replace network rule myhome_ip
type = ipv4
mode = ingress
value_list = ('xxx.xxx.xxx.xxx/32');
create or replace network policy accoutlevel_network_policy
allowed_network_rule_list = ('myhome_ip');
use role accountadmin;
alter account set network_policy = accoutlevel_network_policy;
この設定を行った上で、別のIPアドレスからSnowflakeアカウントにログインしようとすると、下図のように表示されます。
また、この設定を行った上で、dbt Cloudから対象のSnowflakeアカウントに対するdbt project作成時の接続テストを行おうとすると、エラーになります。
dbt CloudのIPアドレスをSnowflakeのNetwork policy/ruleとして追加
dbt CloudからSnowflakeに接続ができるように、dbt CloudのIPアドレスをSnowflakeのNetwork policy/ruleとして追加してみます。
dbt CloudのIPアドレスの確認
dbt Cloudの公式ドキュメントでIPアドレスを確認可能です。
dbt CloudがホストされているリージョンによってIPアドレスが異なるため、ご注意ください。
dbt CloudのIPアドレスをSnowflakeのNetwork policy/ruleとして追加
確認したdbt CloudのIPアドレスをSnowflakeのNetwork policy/ruleとして追加してみます。事前準備で作成したアカウント用のNetwork policyの定義を変更する形で実施します。
(弊社の環境が北米で動いているdbt Cloudのため、そのIPアドレスを指定しています。)
use role network_admin;
use database securitydb;
use schema network_rules;
create or replace network rule dbtcloud_ip
type = ipv4
mode = ingress
value_list = ( '52.45.144.63','54.81.134.249','52.22.161.231','52.3.77.232','3.214.191.130','34.233.79.135');
alter network policy accoutlevel_network_policy
set allowed_network_rule_list = ('myhome_ip','dbtcloud_ip');
この後で、再度dbt Cloudから対象のSnowflakeアカウントに対するdbt project作成時の接続テストを行おうとすると、無事に成功しました。
おまけ
dbt Cloudの公式ドキュメントに下記の記載があるため、IPの指定ではなくホスト名の指定で対応した方が望ましいと思っています。
Dynamic IP addresses — dbt Cloud infrastructure uses Amazon Web Services (AWS). dbt Cloud offers static URLs for streamlined access, but the dynamic nature of cloud services means the underlying IP addresses change occasionally. AWS manages the IP ranges and may change them according to their operational and security needs.
Using hostnames for consistent access — To ensure uninterrupted access, we recommend that you use dbt Cloud services using hostnames. Hostnames provide a consistent reference point, regardless of any changes in underlying IP addresses. We are aligning with an industry-standard practice employed by organizations such as Snowflake.
…しかし、Snowflakeの公式ドキュメントを見ると、SnowflakeのNetwork ruleはホスト名の指定の場合MODE = EGRESS
でしか作成ができなかったため、今回はIPアドレスの指定でNetwork ruleを作成しています。
HOST_PORT indicates that the network rule will allow outgoing network traffic based on the domain of the request destination.When TYPE = HOST_PORT, the MODE parameter should be set to EGRESS.